// #include <iostream>
// #include <cstring>
// using namespace std;

// #define MAX_N 2000
// int nums[MAX_N + 5];
// int dp[MAX_N + 5];

// int main()
// {
//     int n;
//     cin >> n;
//     for(int i = 0; i < n; i++)
//         cin >> nums[i];
//     memset(dp, 0x3f, sizeof dp);
//     dp[0] = 0;
//     for(int i = 0; i < n; i++)
//     {
//         for(int j = 0; j < i; j++)
//         {
//             if(j + nums[i] >= i)
//             {
//                 dp[i] = min(dp[j] + 1, dp[i]);
//             }
//         }
//     }
//     // for(int i = 0; i < n; i++) cout << dp[i] << " ";
//     // cout << endl;
//     if(dp[n - 1] == 0x3f3f3f3f) cout << -1;
//     else cout << dp[n - 1];
//     return 0;
// }

// 解法二：
#include <iostream>
#include <stack>
using namespace std;

#define MAX_N 2000
int nums[MAX_N + 5];
int main()
{
    stack<int> st;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> nums[i];
    st.push(0);
    int level = 0, flag = 0;
    while (!st.empty())
    {
        int size = st.size();
        level += 1;
        // std::cout << "当前是第" << level - 1 << "层: ";
        int last_distance = 0;
        int distance = 0;
        for (int i = 0; i < size; i++)
        {
            int top = st.top();
            last_distance = max(last_distance, top);
            st.pop();
            if (nums[top] <= 0)
                continue;
            for (int i = 1; i <= nums[top]; i++)
            {
                if (top + i >= n - 1)
                {
                    flag = 1;
                    break;
                }
                distance = max(distance, top + i);
            }
            if(flag == 1) break;
        }
        for(int i = last_distance + 1; i <= distance; i++)
        {
            st.push(i);
        }
        if(flag == 1) break;
    }
    if (flag == 0)
        cout << -1;
    else
        cout << level;
    return 0;
}